const router = require("express").Router();
const { body, param, query } = require("express-validator");
const validate = require("../middleware/validate");
const { auth, canModifyPost } = require("../middleware/auth");
const ctrl = require("../controllers/post.controller");
const Post = require("../models/Post");

// 列表（可匿名）
router.get(
    "/",
    [
        query("page").optional().isInt({ min: 1 }),
        query("limit").optional().isInt({ min: 1, max: 100 }),
        query("q").optional().isString(),
        query("tag").optional().isString(),
        query("authorId").optional().isMongoId(),
        query("published").optional().isIn(["true", "false", "all"]),
        query("sort").optional().isIn(["latest", "oldest"]),
    ],
    validate,
    ctrl.listPosts
);

// 通过 slug 获取文章（匿名可见已发布）
router.get(
    "/slug/:slug",
    [param("slug").notEmpty()],
    validate,
    // 注意：getPostBySlug 内部会根据登录状态决定是否可见草稿
    ctrl.getPostBySlug
);

// 创建（需登录）
router.post(
    "/",
    auth(true),
    [
        body("title").isLength({ min: 1 }),
        body("content").isLength({ min: 1 }),
        body("tags").optional().isArray(),
        body("published").optional().isBoolean(),
        body("coverImageUrl").optional().isString(),
    ],
    validate,
    ctrl.createPost
);

// 更新（作者或管理员）
router.patch(
    "/:id",
    auth(true),
    [param("id").isMongoId()],
    validate,
    // 在控制器内取 post 校验作者；这里作为示例也可提前查询
    async (req, res, next) => {
        const post = await Post.findById(req.params.id);
        if (!post) return res.status(404).json({ message: "文章不存在" });
        // 权限判断
        return canModifyPost(() => post.author)(req, res, next);
    },
    [
        body("title").optional().isLength({ min: 1 }),
        body("content").optional().isLength({ min: 1 }),
        body("tags").optional().isArray(),
        body("published").optional().isBoolean(),
        body("coverImageUrl").optional().isString(),
    ],
    validate,
    ctrl.updatePost
);

// 删除（作者或管理员）
router.delete(
    "/:id",
    auth(true),
    [param("id").isMongoId()],
    validate,
    async (req, res, next) => {
        const Post = require("../models/Post");
        const post = await Post.findById(req.params.id);
        if (!post) return res.status(404).json({ message: "文章不存在" });
        return canModifyPost(() => post.author)(req, res, next);
    },
    ctrl.deletePost
);

module.exports = router;
